From 6ecbae750bdb0954fb6ce420f6d586cf9cf48fa3 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 4 Feb 2009 12:01:05 +0000 Subject: [PATCH] xend: Delay before SIGKILL qemu Signed-off-by: Yosuke Iwamatsu --- tools/python/xen/xend/image.py | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/tools/python/xen/xend/image.py b/tools/python/xen/xend/image.py index 267d31aaa4..9db58e2153 100644 --- a/tools/python/xen/xend/image.py +++ b/tools/python/xen/xend/image.py @@ -558,24 +558,30 @@ class ImageHandler: os.kill(self.pid, signal.SIGHUP) except OSError, exn: log.exception(exn) - try: - # Try to reap the child every 100ms for 10s. Then SIGKILL it. - for i in xrange(100): + # Try to reap the child every 100ms for 10s. Then SIGKILL it. + for i in xrange(100): + try: (p, rv) = os.waitpid(self.pid, os.WNOHANG) if p == self.pid: break - time.sleep(0.1) - else: - log.warning("DeviceModel %d took more than 10s " - "to terminate: sending SIGKILL" % self.pid) + except OSError: + # This is expected if Xend has been restarted within + # the life of this domain. In this case, we can kill + # the process, but we can't wait for it because it's + # not our child. We continue this loop, and after it is + # terminated make really sure the process is going away + # (SIGKILL). + pass + time.sleep(0.1) + else: + log.warning("DeviceModel %d took more than 10s " + "to terminate: sending SIGKILL" % self.pid) + try: os.kill(self.pid, signal.SIGKILL) os.waitpid(self.pid, 0) - except OSError, exn: - # This is expected if Xend has been restarted within the - # life of this domain. In this case, we can kill the process, - # but we can't wait for it because it's not our child. - # We just make really sure it's going away (SIGKILL) first. - os.kill(self.pid, signal.SIGKILL) + except OSError: + # This happens if the process doesn't exist. + pass state = xstransact.Remove("/local/domain/0/device-model/%i" % self.vm.getDomid()) finally: -- 2.30.2